#!c:/Python27/python.exe -u
# -*- coding: utf-8/IGNORE',$string);-*-
''' Tema - Linguagens de Programação Dinâmicas
Trabalho de Python á Discíplina - Linguagens de Programação

ReadFile.py, tem como função Ler e Escrever dados recolhidos de um ficheiro xls 
Depois de executar a leitura e escrita, criando assim um Banco de Dados, o objetivo do ReadFile é  
efetuar algmas execuções e funções sobre a base de dados.   
'''
__author__ = "Miguel Fialho, N 5958 - Pedro Serrano, N 3958"
__copyright__ = "Copyright 2014 - Miguel Fialho / Pedro Serrano"
__credits__ = ""
__license__ = "GPL"
__maintainer__ = "1.0"
__email__ = "mF200_5@hotmail.com, pedromsserrano@gmail.com"
__status__ = ""

'''Importações de bibliotecas e módulos para o desenvolvimento de funções aritméticas, gráficas, lógicas, entre outras...'''
import os
import xlrd
import sqlalchemy
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
from sqlalchemy import Column, Integer, String
from sqlalchemy.orm import sessionmaker
from sqlalchemy import create_engine
import Tkinter
from Tkinter import *
import tkMessageBox

filename = None

def Read_xls(filename, row, col):
    '''
    Método para ler o ficheiro 'IPC_Portugal_1977_2013.xls', a variavel filename recebe o nome do ficheiro xls a abrir
    row -- linha a ser lida
    col -- coluna a ser lida
    filename -- conteudo de uma celula do xls
    '''
    File_xls = xlrd.open_workbook(filename)
    sheet = File_xls.sheet_by_name(u'Dados')
    #print (sheet.cell_value(row, col))
    return sheet.cell_value(row, col)
    pass


class CriacaoTabelas(Base):
    '''
    Classe que cria instancias de cada tabela a ser inserida na Base de Dados, utilizando sqlalchemy
    os atributos correspondem as colunas para cada linha/tabela
    '''
    __tablename__ = 'salarios'
 
    id = Column(Integer, primary_key = True )
    ano = Column(Integer)
    ipc_global = Column(Integer)
    inflacao = Column(Integer)
    rum_minima = Column(Integer)
    rem_maxima = Column(Integer)
    pib = Column(Integer)
    rem_nac = Column(Integer)
    rem_disp = Column(Integer)
    remu_capital = Column(Integer)


    def __init__(self, id, ano, ipc_global, inflacao,
                  rum_minima, rem_maxima, pib, rem_nac, rem_disp,remu_capital ):
        '''
        cria instancias de cada atributo a ser incrementado nas tabelas da Base de Dados
        os atributos correspondem as colunas para cada linha/tabela
        '''
        self.id = id
        self.ano = ano
        self.ipc_global = ipc_global
        self.inflacao = inflacao
        self.rum_minima = rum_minima
        self.rem_maxima = rem_maxima
        self.pib = pib
        self.rem_nac = rem_nac
        self.rem_disp = rem_disp
        self.remu_capital = remu_capital
   
class AccoesBD():
    '''
    Classe responsável pelas acções a serem executadas na Base de Dados
    ''' 
    database = None
    login = None
    Base = None
    
    def __init__(self):
        '''
        Cria uma instância mapeada do Banco de Dados Fisico 
        '''
        self.database = create_engine('sqlite:///DataBase.db', echo = False) 
    pass

    def __create_database__(self):
        '''
        Criação e Inicialização da Base de Dados já instânciada e mapeada  
        '''
        Base.metadata.create_all(self.database)
    pass
    
    def __insert__(self): 
        '''
        Método que cria uma sessão na Base de Dados, lê os dados do ficheiro xls 
        efectua o Commit a Base de dados para inserir os mesmos, os dados só são inseridos com esta função
        para que esta função funcionar, a base de dados tem que existir 
        '''       
        self.login = sessionmaker(bind=self.database)
        self.login.configure(bind=self.database)
        self.login = self.login()
        for x in range(1 , 38):
            self.login.add(CriacaoTabelas(x, Read_xls(filename, x, 1), Read_xls(filename, x, 2),
                Read_xls(filename, x, 3), Read_xls(filename, x, 4),
                Read_xls(filename, x, 5),Read_xls(filename, x, 6),Read_xls(filename, x, 7),
                Read_xls(filename, x, 8),Read_xls(filename, x, 9)))
            pass
            self.__commit__()
            pass

    def __commit__(self):
        '''
        Método que fectua a função de transação entre os dados da aplicação e a base de dados 
        '''
        self.login.query(CriacaoTabelas).all()
        self.login.commit()
        pass

    def __dropBD__(self):
        '''
         Método que fectua a função de remoção dos dados da base de dados 
        '''
        os.remove("DataBase.db")
        pass
pass

#Verifica se contem o ficheiro xls na directoria do programa
filename = 'IPC_Portugal_1977_2013.xls'
try:
    File_xls = xlrd.open_workbook(filename)
    pass
except OSError, e:
    if e.errno == 2:
        pass
except:
    pass
try:
    sheet = File_xls.sheet_by_name(u'Dados')
    pass
except NameError: #surppres NameError: name 'File_xls' is not defined
    tmp_tkinter = Tkinter.Tk()
    tkMessageBox.showinfo("Exception!","Não tem o ficheiro 'IPC_Portugal_1977_2013.xls' na directria do 'Main.py' pressione OK e selecione onde tem o ficheiro! ")
    filename = tkFileDialog.askdirectory(parent=tmp_tkinter ,initialdir="/",title='Selecione o a DIRECTORIA onde o ficheiro .xls se encontra')
    filename = filename + "/'IPC_Portugal_1977_2013.xls'"
    File_xls = xlrd.open_workbook(filename)
    sheet = File_xls.sheet_by_name(u'Dados')
    tmp_msg = tkMessageBox
    tmp_msg.showinfo("AGUARDE!"," Esta a abrir a interface ")
    tmp_tkinter.destroy()
    pass
filename = 'IPC_Portugal_1977_2013.xls'